【AWS CDK】LambdaのL1コンストラクトでlambda.Codeクラスを使ってデプロイする

【AWS CDK】LambdaのL1コンストラクトでlambda.Codeクラスを使ってデプロイする

Clock Icon2024.07.25

データアナリティクス事業本部のueharaです。

今回は、AWS CDKにおいてLambdaのL1コンストラクトで lambda.Code クラスを使ってデプロイしてみたいと思います。

はじめに

AWS CDKにはCloudFormationスタックからAWS CDKへ移行を行うCDK Migrateがあります。

ただ、CDK Migrateで移行した場合は全てL1コンストラクトで定義されており、Lambda関数においては cdk migrate コマンドを実行したタイミングでLambda関数のリソースがzip化されたファイルがS3にアップロードされ、それを参照する形となっています。

migrate直後の状態.ts
const hogeXxxLambdaFunction = new lambda.CfnFunction(this, 'HogeXxxLambdaFunction', {
  code: {
    s3Bucket: 'cdk-test-deploy',
    s3Key: 'foo/bar/1718863334164-2024-07-24T06:02:14.164Z/HogeXxx.zip',
  },
  handler: 'handler/hoge_xxx.lambda_handler',
  runtime: 'python3.9',
  functionName: 'hoge-xxx-lambda',
  memorySize: 5140,
  timeout: 900,
  ephemeralStorage: {
    size: 2048,
  },
  role: LambdaRoleArn
});

ただ、この状態でそのまま運用してしまうと、仮にソース修正が入った場合変更に更新に一手間かかります。

できれば、code 部分だけでも修正を行い、L2コンストラクトのLambdaのように lambda.Code クラスを使ってローカルのディレクトリを参照してデプロイする運用としたいです。

L2コンストラクトのLambda.ts
const hogeXxxLambdaFunction = new lambda.Function(this, 'HogeXxxLambdaFunction', {
  functionName: 'hoge-xxx-lambda',
  runtime: lambda.Runtime.PYTHON_3_9,
  code: lambda.Code.fromAsset("resources/lambda"), // こんな感じ
  handler: "hoge_xxx.lambda_handler",
  memorySize: 5140,
  timeout: cdk.Duration.seconds(900),
  ephemeralStorageSize: Size.mebibytes(2048),
  role: LambdaRole
});

ここで、L2コンストラクトのpropsの code のtypeは lambda.Code ですが、L1コンストラクトの code のtypeは CfnFunction.CodeProperty なので、L2クラスのようにそのまま渡してしまうとエラーとなります。

CDK Migrate(もといL1コンストラクトのLamda)を利用しつつ、今後もLambda関数に改修が入る可能性があるのであれば lambda.Code クラスを使えた方が便利なので、以下ではL1コンストラクトと lambda.Code クラスを一緒に使う方法を説明します。

対応方法

結論から言うと、LambdaのL2コンストラクタがL1コンストラクタをラップしている処理と同様に、 bind() を利用することで対応できます。

const code = lambda.Code.fromAsset("resources/lambda").bind(this);
const hogeXxxLambdaFunction = new lambda.CfnFunction(this, 'HogeXxxLambdaFunction', {
  code: {
    s3Bucket: code.s3Location && code.s3Location.bucketName,
    s3Key: code.s3Location && code.s3Location.objectKey,
  },
  handler: 'handler/hoge_xxx.lambda_handler',
  runtime: 'python3.9',
  functionName: 'hoge-xxx-lambda',
  memorySize: 5140,
  timeout: 900,
  ephemeralStorage: {
    size: 2048,
  },
  role: LambdaRoleArn
});

bind() 関数はこちらのソースの通り、S3バケットに資材をアップロードし、以下のような値をリターンしてくれます。

return {
  s3Location: {
    bucketName: this.asset.s3BucketName,
    objectKey: this.asset.s3ObjectKey,
  },
};

この値を CfnFunction.CodeProperty としてL1コンストラクトのLamdaに渡してあげればやりたいことが実現できます。

最後に

今回は、AWS CDKにおいてLambdaのL1コンストラクトで lambda.Code クラスを使ってデプロイしてしてみました。

参考になりましたら幸いです。

参考文献

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.